package com.mastercard.assets.web.struts.actions;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblPaises;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.jpa.TblTipoCampania;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblTipoProducto;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.reporteForm;
import com.mastercard.assets.web.struts.forms.reporteOne;
import com.mastercard.assets.web.util.reportes.datosReporteCuatro;
import com.mastercard.assets.web.util.reportes.datosReporteDos;
import com.mastercard.assets.web.util.reportes.datosReporteTres;
import com.mastercard.assets.web.util.reportes.reportFour;
import com.mastercard.assets.web.util.reportes.reportOne;
import com.mastercard.assets.web.util.reportes.reportThree;
import com.mastercard.assets.web.util.reportes.reporteTwo;
import com.mastercard.assets.web.util.reportes.totalesReporteTres;
import com.mastercard.assets.web.util.reportes.totalesReporteUno;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.web.util.to.UserLogin;
import com.mastercard.assets.web.util.to.utilReporteUno;
import java.util.ArrayList;
import java.util.List;

public class Reportes
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
                
                reporteForm f = ( reporteForm ) form ;
                reporteForm datosFormulario = f ;
                List<utilReporteUno> reporte = new ArrayList<utilReporteUno>( ) ; 
                List< datosReporteDos > reporteDos = new ArrayList< datosReporteDos >( ) ;
                List< datosReporteTres > reporteTres = new ArrayList< datosReporteTres >( ) ;
                List< datosReporteCuatro > reporteCuatro = new ArrayList< datosReporteCuatro >( ) ;
                
                String msgAnioEmpty = "" ;
                int country = 0 ;
                
                if( f.getTipo( ) == 1 ){
                    
                    country = f.getPais( ) ;
                    
                }else
                    if( f.getTipo( ) == 3 ){
                        
                        country = f.getPaisR3( ) ;
                        
                    }else
                        if( f.getTipo( ) == 2 ){
                            
                            country = f.getPaisR2( ) ;
                            
                        }else
                            if( f.getTipo( ) ==  4 ){
                                
                                country = f.getPaisR4( ) ;
                                
                            }
                
                try{
                    // recarga y busca los productos ligados a un tipo de producto
                    if( f.getRecarga( ) == 1 || f.getTipoProducto( ) > 0 ) {
                        List< TblProducto > Productos = MasterCardDAO.getAllActiveProductWithProductType( f.getTipoProducto( ) ) ;
                        request.setAttribute("Productos", Productos) ;
                        if( f.getRecarga( ) == 1 )
                            f.setRecarga( 0 ) ;
                    }
                    // recarga y busca las campañas y assets ligadas a un pais
                    if( f.getRecarga( ) == 2 || country > 0 || f.getRecarga( ) == 3 ) {
                        
                        List< TblAsset > Assets = new ArrayList< TblAsset >( ) ;
                        List< TblAsset > listaAsset = MasterCardDAO.getAllActiveAssetsByPais( country ) ;
                        
                        for( TblAsset asset : listaAsset ) {
                            
                            if( asset.getStatus( ) == 1 )
                                Assets.add( asset ) ;
                        }
                                                
                        List< TblCampania > campanias = new ArrayList< TblCampania >( ) ;
                        if( f.getTipo( ) == 1 || f.getTipo( ) == 4 ){// tipo de campaña uno
                            campanias = MasterCardDAO.findAuthorizedCampaignByCountry( country ) ;
                        }else
                            if( f.getTipo( ) == 3 ){// tipo de campaña dos
                                campanias = MasterCardDAO.findAllActivCampaignsByCountry( country ) ;
                            }
                                
                        
                        request.setAttribute("Campanias", campanias) ;
                        request.setAttribute("Assets", Assets) ;
                        
                        if( f.getRecarga( ) == 2 )
                            f.setRecarga( 0 ) ;
                    }
                    
                    
                    List<TblPaises> paises = MasterCardDAO.getPaises( ) ;                    
                    request.setAttribute("Paises", paises);
                    
                    List<TblCuenta> cuenta = MasterCardDAO.getAllActiveCountsByCountry( country ) ;
                    request.setAttribute("Cuentas", cuenta);
                    
                    List< TblTipoCuenta > tipoCuentas =  MasterCardDAO.getAllActiveCountTypesByCountry( country ) ;
                    request.setAttribute("TCuentas", tipoCuentas);
                    
                    List< TblTipoCampania > tipoCampania = MasterCardDAO.getAllActiveCampaignTypes( ) ;
                    request.setAttribute("TipoCampanias", tipoCampania ) ;
                    
                    List< TblTipoProducto > tipoProducto = MasterCardDAO.getAllActiveProductTypes( ) ;
                    request.setAttribute("TipoProducto", tipoProducto) ;
                    
                    // crea un arreglo con el objeto que contiene los parametros para mostrar el REPORTE
                    if( f.getRepo( ) == 1 ) {
                        
                        if( f.getTipo( ) == 1 ){// Reporte numero 1
                                                        
//                            List< TblCampania > campaigns = MasterCardDAO.FindAllAuthorizedCampaigns( ) ;
                            reporte = reportOne.generaReporteUno( f ) ;
                            MasterCardDAO.closeEntityManager( ) ;
                            
                            // APLICA FILTROS
//                            campaigns = reportOne.filtros( datosFormulario , campaigns ) ;

                            //OBTIENE ARREGLO REPORTE
//                            reporte = reportOne.generaReporte( campaigns, datosFormulario ) ;
                            reporte = reportOne.completaReporteUno( reporte ) ;
                                                        
                            // TOTALES DEL REPORTE
//                            totalesReporteUno tr = reportOne.totales( reporte ) ;
//                            request.setAttribute( "Totales", tr );
                            
                        }// termia el reporte numero 1
                        
                        if( f.getTipo( ) == 2 ){// Inicia Reporte numero 2
                            
                            if( f.getAnio( ) == 0 ){
                                
                                msgAnioEmpty = "Debes ingresar un a&ntilde;o" ;
                                request.setAttribute("msgAnioEmpty", msgAnioEmpty);
                                
                            }else{
                                
                                reporteDos = reporteTwo.generaReporte( datosFormulario ) ;
                                
                            }
                            
                        }// Termina Reporte numero 2
                        
                        if( f.getTipo( ) == 3 ){// Inicia Reporte numero 3
                            
                            if( f.getAnioR3( ) == 0 ){
                                
                                msgAnioEmpty = "Debes ingresar un a&ntilde;o" ;
                                request.setAttribute("msgAnioEmpty", msgAnioEmpty);
                                
                            }else{
                                
                               reporteTres = reportThree.generaReporteTres( datosFormulario ) ;
                               totalesReporteTres totales = reportThree.totalesParaR3( reporteTres, datosFormulario ) ;
                               request.setAttribute("totR3", totales);
                               
                            }
                            
                        }// Termina Reporte numero 3
                        
                        if( f.getTipo( ) == 4 ){// Inicia Reporte numero 3
                            
                            if( f.getAnioR4( ) == 0 ){
                                
                                msgAnioEmpty = "Debes ingresar un a&ntilde;o" ;
                                request.setAttribute("msgAnioEmpty", msgAnioEmpty);
                                
                            }else{
                                
                               reporteCuatro = reportFour.generaReporteCuatro( datosFormulario ) ;
                               reporteCuatro = reportFour.totalesParaR4( reporteCuatro , datosFormulario ) ;
                               int[ ] totales = reportFour.totales( reporteCuatro ) ;
                               request.setAttribute("totR4", totales) ;
                               
                            }
                            
                        }// Termina Reporte numero 3
                        
                        f.setRepo( 0 ) ;
                    }
                    
                }catch( Exception e ){
                    e.printStackTrace( ) ;
                    MasterCardDAO.closeEntityManager( ) ;
                }

                    MasterCardDAO.closeEntityManager( ) ;
                    user.setNextWorkArea( "/WEB-INF/pages/WorkArea/Reportes.jsp" );
                    user.setMenuAct(12);
                    request.setAttribute("Form", f);
                    request.setAttribute("RepUno", reporte);
                    request.setAttribute("RepDos", reporteDos);
                    request.setAttribute("RepTres", reporteTres);
                    request.setAttribute("RepCuatro", reporteCuatro) ;
                    return mapping.findForward( "success" ) ;
//                }
		
	}        
        
}//fin de la clase